查看原文
其他

【连载】比特币史话 | 哈希(4)

刘教链 刘教链 2023-01-30

(V神,以太坊创始人。图片来源于网络)
本篇看点:中本聪为何在比特币中使用双层哈希?又一次料事如神?V神的以太坊又用了怎样的哈希函数?

前情回顾:
【连载】比特币史话 | 量子霸权(3)
【连载】比特币史话 | 哈希(1)
【连载】比特币史话 | 哈希(2)
【连载】比特币史话 | 哈希(3)

正文:

20世纪80年代,欧盟启动了“RACE(欧洲先进通信技术研发)计划”,并于1992年启动了“RIPE项目”。其中项目名“RIPE”的具体含义是“RACE完整性原语求值”(RACE Integrity Primitives Evaluation)。从这个名字我们就能读出“哈希”的味道,因为对给定内容求哈希值这一计算机指令(术语叫“原语”)正好可以用来验证内容的完整性,也就是没有被篡改。如果发生了篡改,即使再微小,也会导致哈希值的剧烈变化,从而很容易被发现。在“RIPE项目”的执行过程中,一个哈希算法被设计出来了,它的名字叫做RIPEMD(RIPE消息摘要, RIPE Message Digest)。[1][公众号:刘教链]

RIPEMD家族也有一系列所求摘要长度不等的哈希函数。其中摘要长度小于160比特的,被认为安全性不够,而摘要长度大于160比特的,其实际安全强度也就只有160比特,超出的部分只是为了凑够长度。所以,就余下一个RIPEMD-160不长不短刚刚好。根据我们对哈希算法命名的了解,RIPEMD-160计算出来的哈希值长度为160比特币,这个长度和SHA-1是一样的,都比SHA-256要短。中本聪说,“为了让比特币地址更短,它们是公钥的哈希,而不是(椭圆曲线电子签名算法的)公钥”[2]。事实上,中本聪不是用了一个哈希函数,而是两个。他先对公钥做了SHA-256哈希,然后把结果又做了一次RIPEMD-160哈希,得到了比特币地址。这种双层哈希的设计,是中本聪的一个独特手法。在比特币区块挖矿中,也是这样的双层哈希结构,只不过换成了两层SHA-256。[2][公众号:刘教链]

中本聪没有解释过如此设计的原因。今天的我们已经知道,MD5、SHA-1、SHA-2这一系列的哈希算法,当然也就包括中本聪选用的SHA-256哈希算法,由于都使用了一种称之为“默克尔-丹加德”构造(Merkle–Damgård construction)的方法,而对一种称之为“长度扩展攻击”(length extension attack)的攻击方法敏感[4]。通过使用这种攻击方法,攻击者可以在无需知道原文、只需知道原文长度的情况下,向原文后附加攻击文本并计算出正确的哈希值。今天我们能够查到的最早有关该攻击方法的文献,只能追溯到2012年。至于中本聪在2008年前后设计比特币时,是如何觉察到单层哈希可能会对某种特别的攻击方法敏感,从而在使用时小心翼翼的加了一层,形成双层哈希设计,我们就不得而知了。也许,他是受到了NIST(美国国家标准技术局)在2006年举办的哈希函数设计大赛的启发吗?[公众号:刘教链]

2006年,NIST举办了一场后来旷日持久的哈希函数设计大赛,赛题是设计一种不使用“默克尔-丹加德”构造的崭新的哈希函数,称之为SHA-3。彼时,SHA-3的设计目标并非为了取代SHA-2,因为后者并未被攻破。但是因为MD5和SHA-1在2005年被王小云教授团队成功攻破了,NIST感觉需要未雨绸缪,于是希望提早着手,为SHA-2准备“备胎”。这个大赛,可以称之为SHA-2的“备胎计划”。[5][公众号:刘教链]

这个“备胎计划”的推进一波三折。2010年12月,一个称之为keccak-256的哈希函数最终胜出。NIST希望在标准化时对其设计进行微调和修订,却被2013年突发的“棱镜门”事件和斯诺登的“吹哨”打乱了节奏。公众失去了对NIST的信任,对NIST修订哈希函数的提案进行了强烈抵制。就这样一直僵持到2015年,NIST才最终完成了修订并发布了FIPS 202标准。另外一个由俄裔加拿大程序员维塔利克·布特林(Vitalik Buterin,人称“V神”,时年仅19岁)于2013年发起的知名公链项目,以太坊(Ethereum),大量使用了keccak-256哈希函数,但是,他们使用的是重写的原始版keccak算法,而不是NIST的修订版算法。由于keccak算法没有使用“默克尔-丹加德”构造,而是使用了另外一种称之为“海绵构造”(sponge construction)的新方法,所以对“长度扩展攻击”免疫。也因为此,以太坊的地址就是单层哈希结构,只对公钥做了一次keccak-256哈希(并截取了后20位以缩短长度)。[6][公众号:刘教链]

【未完待续】(公众号:刘教链)

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存